package br.com.websec.cnab;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.ArrayList;

import br.com.websec.titulo.Titulo;
import br.com.websec.util.CnabUtil;
import br.com.websec.util.FuncoesUtil;
import br.com.websec.util.UtilException;

	public class RetornoBancario {

		private static final long serialVersionUID = 1l;

		public final CnabUtil cnabutil = new CnabUtil();
		
		ArrayList<CnabUtil> registros = null;
		private String codigoBanco;
		
		

		
		String getCodigoBanco() {
			return codigoBanco;
		}
		void setCodigoBanco(String codigoBanco) {
			this.codigoBanco = codigoBanco;
		}
		public boolean execImportar(String codigoBanco) {

			boolean retorno = true;

			String sFileName = "C:\"//fileDialogCnab.getDirectory() + fileDialogCnab.getFile();";
			File fileCnab = new File( sFileName );

			if ( fileCnab.exists() ) {

				try {

					FileReader fileLeitorCnab = new FileReader( fileCnab );

					if ( leArquivo( fileLeitorCnab, registros, codigoBanco ) ) {

						retorno = loadGrid();
					}
				} 
				catch ( IOException ioError ) {
					FuncoesUtil.mensagemInformativa("Erro ao ler o arquivo: " + sFileName + "\n" + ioError.getMessage());
					retorno = false;
				}
			}
			else {
				FuncoesUtil.mensagemInformativa( "Arquivo " + sFileName + " não existe!" );
				retorno = false;
			}
				
			return retorno;
		}
		private boolean leArquivo( final FileReader fileReaderCnab, final ArrayList<CnabUtil> list, String codigoBanco ) throws IOException {

			boolean retorno = true;
			char tipoRegistro;
			String line = null;
			BufferedReader in = new BufferedReader( fileReaderCnab );
			Cabecalho registroCabecalho = null;
			try {

				while ( ( ( line = in.readLine() ) != null) && ( ! "".equals( line.trim() )) ) {

					// Padrão CNAB 400
					tipoRegistro = line.charAt( 0 );
					//RegT400 reg1 = null;
					switch ( tipoRegistro ) {
						case '0' :
							registroCabecalho = new Cabecalho( line );
							list.add( registroCabecalho );
							break;
						case '1' :  // Cnab 400 convênio menor que 1.000.000
							Detalhe reg1 = new Detalhe();
							reg1.setCodigoBanco(codigoBanco );
							reg1.parseLine( line );
							list.add( reg1 );

							if ( reg1 == null || !registroCabecalho.getCodigoBanco().trim().equals( codigoBanco.trim() ) ) {
								FuncoesUtil.mensagemInforma( "Arquivo de retorno não refere-se ao banco selecionado!" );
								return false;
							}
					}

						
				}

			} 
			catch ( UtilException e ) {
				FuncoesUtil.mensagemInformativa("Erro lendo o arquivo!\n" + e.getMessage() );
				e.printStackTrace();
				retorno = false;
			}

			in.close();

			return retorno;
		}

		private boolean montaGrid( ArrayList<CnabUtil> registros, String codigoBanco ) {

			boolean retorno = true;

			if ( registros != null ) {

				try {

					Cabecalho cabecalho = null;

					Titulo titulo = null;

					BigDecimal valorPago;
					Date dataPagamento;
					BigDecimal valorDesconto;
					BigDecimal valorJuros;

					String shistorico = "BAIXA AUTOMÁTICA CNAB";

					//Integer codigohistoricohc = (Integer) prefs.get( "CODHISTCNAB" );
					//Historico hist = null;

					for ( CnabUtil cnab : registros ) {

						if ( cnab instanceof Cabecalho ) {

							cabecalho = (Cabecalho) cnab;
						}
						
					}
					if ( cabecalho != null ) {

						// Se não for cnab 400 (implementação não identificada realizada pelo Alex - Para evitar problemas em clientes já implantados...
							if (cabecalho!=null && cabecalho.getOcorrencias()!=null) {
								String codigo = ( "53" + cabecalho.getOcorrencias().trim() + "00" ).substring( 0, 4 );
							}
							return false;
					}
					else {

					}

				} catch ( Exception e ) {
					retorno = false;
					FuncoesUtil.mensagemInforma("Erro no carregamento da tabela!\n" + e.getMessage() );
					e.printStackTrace();
				}
			}
			else {
				retorno = false;
			}

			return retorno;
		}



		protected boolean loadGrid() {
			boolean retorno = true;
		

			if ( !montaGrid( registros, getCodigoBanco() ) ) {
				// Funcoes.mensagemInforma( this, "Nenhum registro de retorno encontrado." );
				System.out.println("  Nenhum registro de retorno encontrado." );
				retorno = false;
			}

			return retorno;
		}

}
